﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using CapaDatos;

namespace CapaNegocio
{
    public class EtapaObra:IBaseDeDatos
    {
        private int codigo;
        private Etapa etapa;
        private OrdenTrabajo ordenTrabajo;
        private DateTime fechaInicio;
        private DateTime fechaFin;
        private DateTime fechaInicioReal;


        public EtapaObra(string descripcion) {
            etapa = new Etapa();
            etapa.Descripcion = descripcion;
        }

        public EtapaObra()
        {
        }

        public DateTime FechaInicioReal
        {
            get { return fechaInicioReal; }
            set { fechaInicioReal = value; }
        }
        private DateTime fechaFinReal;

        public DateTime FechaFinReal
        {
            get { return fechaFinReal; }
            set { fechaFinReal = value; }
        }
        
        public int Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }
       
        public Etapa Etapa
        {
            get { return etapa; }
            set { etapa = value; }
        }
        
        public DateTime FechaInicio
        {
            get { return fechaInicio; }
            set { fechaInicio = value; }
        }
        
        public DateTime FechaFin
        {
            get { return fechaFin; }
            set { fechaFin = value; }
        }
     
        public OrdenTrabajo OrdenTrabajo
        {
            get { return ordenTrabajo; }
            set { ordenTrabajo = value; }
        }

        public int DiasTotalesEstipulados()
        {
            return fechaFin.Subtract(fechaInicio).Days;
        }

        public int DiasTotalesReales()
        {

             if (fechaFinReal != default(DateTime) && fechaInicioReal != default(DateTime))
                return fechaFinReal.Subtract(fechaInicioReal).Days;
             else 
                 return 0;
        }

        public int obtenerProximaEtapa() {
            int cod=etapa.Codigo + 1;
             return cod>=7?7:cod;
        }

        public static List<EtapaObra> buscarEtapas(int pOt)
        {
            ArrayList etapas = ServidorDatos.buscarEtapasDeOT(pOt);
            EtapaObra etapa = null;
            List<EtapaObra> lista = new List<EtapaObra>();
            foreach (ArrayList e in etapas)
            {
                etapa = new EtapaObra();
                etapa.buildObject(e);
                lista.Add(etapa);
            }

            return lista;
        }

        public static int registrarEtapa(Etapa etapa, OrdenTrabajo ot,List<Obrero> pObreros, Dictionary<int, int> pHerramientas,
            DateTime pFechaIni, DateTime pFechaFin) {
                try
                {

                    int id = ServidorDatos.registrarEtapa(etapa.Codigo, ot.Codigo, pFechaIni, pFechaFin);

                    foreach (Obrero o in pObreros)
                    {
                        AsignacionObrero.registrarObrero(id, o.Codigo);
                    }

                    foreach (KeyValuePair<int, int> i in pHerramientas)
                    {
                        AsignacionHerramienta.registrarHerramienta(id, i.Key,i.Value);

                    }

                    return id;
                }
                catch (Exception ex) { 
                    throw ex;
                } 
            }


        public bool modificarEtapa(string pFechaIniReal, string pFechaFinReal)
        {
            try
            {

                return ServidorDatos.modificarEtapaObra(this.codigo,pFechaIniReal, pFechaFinReal);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public string fechaInicioRealToString() { 
            return FechaInicioReal == default(DateTime)?"No determinada":FechaInicioReal.ToShortDateString();
        }

        public string fechaFinRealToString()
        {
            return FechaFinReal == default(DateTime) ? "No determinada" : FechaFinReal.ToShortDateString();
        }


        public void buildObject(ArrayList lista)
        {
           codigo=  Convert.ToInt32(lista[0]);
           etapa=  Etapa.buscarEtapa(Convert.ToInt32(lista[1]));
           ordenTrabajo= OrdenTrabajo.buscarOrden(Convert.ToInt32(lista[2]));
           fechaInicio= Convert.ToDateTime(lista[3]);
           fechaFin = Convert.ToDateTime(lista[4]);

           if (!String.IsNullOrEmpty((String)lista[5])) {
               FechaInicioReal = Convert.ToDateTime(lista[5]);
           }

           if (!String.IsNullOrEmpty((String)lista[6])) {
               FechaFinReal = Convert.ToDateTime(lista[6]);
           }
          
        }


        public EtapaObra getEtapaAnteriorReal() {

            List<EtapaObra> list = EtapaObra.buscarEtapas(this.OrdenTrabajo.Codigo);
            EtapaObra etapa = list.FindLast(delegate(EtapaObra eo)
            {
                return eo.FechaInicioReal != default(DateTime) && eo.FechaFinReal != default(DateTime);
            });

            return etapa;
        
        }
       
    }
}
